task PointExtend(){
let ExtendPoint = [500,1500,2750,4500,6000,8000,9999,3333,6666,9999];//GNXeh̓_Kv̗
let ExtendCount = 0;				//GNXeh񐔂Lϐ
let Point = GetPoint;				//Point̒li[ϐ
let Continue = 3;

loop{
if(GetAllowedContinueCount != Continue){	//ReBj[
ExtendCount = 0;				//{ƓlAGNXeh̒ll
Continue--;					//ReBj[񐔁|P
}
Point = GetPoint;				//擾𖈃t[mF
SetNormPoint(ExtendPoint[ExtendCount]);		//̃GNXeh̐𖈃t[\
if(Point >= ExtendPoint[ExtendCount]){		//GNXeh̒l𒴂

	if(GetPlayerLife >= 8&&GetPlayerBomb >= 6){//c@VȏŃ{UȏȂ{[iX2500_
	AddScore(25000000);}
	if(GetPlayerLife >= 8&&GetPlayerBomb == 5){//c@VȏŃ{TȂ{{P
	AddBomb(1);}
	if(GetPlayerLife >= 8&&GetPlayerBomb <= 4){//c@VȏŃ{SȉȂ{{Q
	AddBomb(2);}
	if(GetPlayerLife <= 7){ExtendPlayer(1);}//c@UȉȂc@{P
	PlaySE("se1UP.wav");			//GNXeh炷
	if(ExtendPoint[ExtendCount] == 9999){
	AddPoint(-9999);			//9999z9999炷
	}
	if(ExtendCount == 9){ExtendCount = 6;}	//GNXeh[v
	ExtendCount++;				//GNXeh񐔁{P
	}
yield;

}
}

task MagicPointOnStage(){

#include_function ".\Config.txt"

SetCommonData("MAGICPOINT",0);
SetCommonData("DRAWBONUS",0);
SetCommonData("DRAWMAX",0);
SetCommonData("FULLITEM_GET",0);
yield;
let E = GetCommonData("EASY_START");
let N = GetCommonData("NORMAL_START");
let H = GetCommonData("HARD_START");
let L = GetCommonData("LUNATIC_START");

let AddToEnemy;
let ReduceToLive;
let ReduceToMissRate = [0,0.1,0.4,0.9,1.6,2.5,3.6,5];
let Level;
let Difficultly;
let Graze = GetGraze;
let GrazeA = 0;
let Point = GetPoint;
let PointA = GetPoint;

let FirstPlayer = ChoosePlayerLife() - 4;
let ReduceToFirstPlayer = [1.5,3,5,7,10];
let ReduceRateUp = 1;
let Count = 0;

if(E == 1){SetCommonData("MAGICPOINT",5);AddToEnemy = 0.8;ReduceToLive = 0.008333;Level = 10;Difficultly = 0;}
if(N == 1){SetCommonData("MAGICPOINT",10);AddToEnemy = 1.4;ReduceToLive = 0.009527;Level = 12;Difficultly = 1;}
if(H == 1){SetCommonData("MAGICPOINT",15);AddToEnemy = 2.0;ReduceToLive = 0.011115;Level = 16;Difficultly = 2;}
if(L == 1){SetCommonData("MAGICPOINT",25);AddToEnemy = 3.0;ReduceToLive = 0.016667;Level = 20;Difficultly = 3;}
if(E > 1){SetCommonData("MAGICPOINT",25);AddToEnemy = 0.8;ReduceToLive = 0.008333;Level = 10;Difficultly = 0;}
if(N > 1){SetCommonData("MAGICPOINT",50);AddToEnemy = 1.4;ReduceToLive = 0.009527;Level = 12;Difficultly = 1;}
if(H > 1){SetCommonData("MAGICPOINT",75);AddToEnemy = 2.0;ReduceToLive = 0.011115;Level = 16;Difficultly = 2;}
if(L > 1){SetCommonData("MAGICPOINT",125);AddToEnemy = 3.0;ReduceToLive = 0.016667;Level = 20;Difficultly = 3;}

let bonusrate = 1 / (10 + 7 * Difficultly);

SetCommonData("MAGICPOINT_ADD",AddToEnemy);
SetCommonData("MAGICPOINT_REDUCE",ReduceToLive);
SetCommonData("MAGICPOINT_BONUSRATE",bonusrate);

let PMP = PlacticeMagicPoint;
SetCommonData("PLACTICE_MAGICPOINT",PMP);
if(IsReplay == true){LoadCommonDataFromReplayFile();}


if(E > 1||N > 1||H > 1||L > 1){
if(GetCommonData("PLACTICE_MAGICPOINT") >= 0){SetCommonData("MAGICPOINT",PMP);}
}

if(FirstPlayer >= 0){ReduceRateUp = ReduceToFirstPlayer[FirstPlayer];}

loop{
	Count++;
	let a	= GetCommonData("MAGICPOINT");
	let zanki = GetPlayerLife;
	if(zanki >= 8){zanki = 7;}
	let ReduceToMiss;
	Graze = GetGraze;

	if(Count >= 90){SetCommonData("BONUSSCORE",0);
	SetCommonData("DRAWBONUS",0);
	SetCommonData("DRAWMAX",0);}

	if(Graze != GrazeA){
	a += (Difficultly  + 1) * zanki * 0.0375;
	GrazeA = Graze;
	SetCommonData("MAGICPOINT",a);
	}

	if(OnBomb == true){
	PointA = GetPoint;
	let b;
	let PMS = GetPlayerMoveState();


	if(PMS == MOVE_NORMAL){
	while(OnBomb == true){yield;	CollectItems;}
	b = (a * 0.6) / ReduceRateUp;
	Point = GetPoint;
	if(PointA > Point){Point += 9999;}
	let Bonus = trunc((Point - PointA) * ((((a / 1000) ^ 2) * 12.5) ^ 2) * 20);

	AddScore(-7500 * (Point - PointA));
	AddScore(Bonus);
	if(Bonus != 0){
	SetCommonData("BONUSSCORE",Bonus);
	yield;
	SetCommonData("DRAWBONUS",1);
	Count = 0;
	b += Bonus / 1000000;
	}
	}

	else if(PMS == MOVE_SLOW){
	let n;
	while(OnBomb == true){yield;	CollectItems;}
	b = (a * 0.93) / ReduceRateUp;
	Point = GetPoint;
	if(PointA > Point){Point += 9999;}
	if(Difficultly <= 1){n = 50;}
	else{n = 50 + (Difficultly - 1) * 25;}
	let BonusP = trunc((Point - PointA) * (0.5 - Difficultly * 0.0625) + (a / n));

	CreateEnemyFromFile(GetCurrentScriptDirectory~"\Stage\ZAKO\Enemy00.txt",GetCenterX,GetCenterY,0,0,BonusP+1);

	AddScore(-15000 * (Point - PointA));
	SetCommonData("BONUSSCORE",BonusP+1);
	loop(2){yield;}
	SetCommonData("DRAWBONUS",2);
	Count = 0;
	CollectItems;
	}

	SetCommonData("MAGICPOINT",b);
	}

	if(OnPlayerMissed == true){
	while(OnPlayerMissed == true){yield;}//炢{ԑҋ@
	if(OnBomb == false){//炢{ɎsĂ猸
	ReduceToMiss = Level * ReduceToMissRate[zanki] * ReduceRateUp;
	a -= ReduceToMiss;
	if(0 >= a){a = 0;}//MasicPointOȉɂȂOɂ
	SetCommonData("MAGICPOINT",a);
	}
	}

	if(GetCommonData("FULLITEM_GET") == 1){
	Count = 0;
	SetCommonData("FULLITEM_GET",0);
	SetCommonData("DRAWMAX",1);
	}

	if(Difficultly <= 1){
	if(a > 999.999999){
	a = 999.999999;
	SetCommonData("MAGICPOINT",a);
	}
	}
	if(Difficultly == 2){
	if(a > 1499.999999){
	a = 1499.999999;
	SetCommonData("MAGICPOINT",a);
	}
	}
	if(Difficultly == 3){
	if(a > 1999.999999){
	a = 1999.999999;
	SetCommonData("MAGICPOINT",a);
	}
	}
yield;
}
}


function MagicPointDrawText(){

function NumToString(let num){
let leng = trunc(log10(num))+1;//̌߂
let string = ToString(num);//𕶎ɕς
let lengA = 0;

if(leng < 2&& leng >= 1){lengA = 1;}
if(leng < 3&& leng >= 2){lengA = 2;}
if(leng < 4&& leng >= 3){lengA = 3;}
if(leng < 5&& leng >= 4){lengA = 4;}
if(leng < 6&& leng >= 5){lengA = 5;}
if(leng < 7&& leng >= 6){lengA = 6;}
if(leng < 8&& leng >= 7){lengA = 7;}
if(leng < 9&& leng >= 8){lengA = 8;}
if(leng < 10&& leng >= 9){lengA = 9;}
if(leng >= 10){lengA = 10;}

loop(10 - lengA){
string = " "~string;
}

return string[0..10];//XCVOĕԂ
}

let E  = GetCommonData("EASY_START");
let N  = GetCommonData("NORMAL_START");
let H  = GetCommonData("HARD_START");
let L  = GetCommonData("LUNATIC_START");
let EX = GetCommonData("EXTRA_START");

let Total = GetCommonDataDefault("GAMECLEAR_BONUS",0);

let textA = "MagicPoint";
let textB = ToString(GetCommonData("MAGICPOINT"));
let textC = "MagicPoint MAX!";
let textD = "MP"~ToString(GetCommonData("MAGICPOWER"));
let textE = "ScoreBonus!"~NumToString(GetCommonData("BONUSSCORE"));
let textF = "PointItemBonus!"~NumToString(GetCommonData("BONUSSCORE"));

let textG = "ALL CLEAR!";
let textH = "CLEAR      100000000 *            1 = 100000000";
let textI = "PLAYER      20000000 * "~NumToString(GetPlayerLife)~" = "~NumToString(GetPlayerLife * 20000000);
let textJ = "BOMB         1000000 * "~NumToString(GetPlayerBomb)~" = "~NumToString(GetPlayerBomb * 1000000);
let textK = "MAGICPOINT      3000 * "~NumToString(GetCommonData("MAGICPOINT"))~" = "~NumToString(GetCommonData("MAGICPOINT")*3000);
let textL = "EASY LEVEL * 0.5";
let textM = "HARD LEVEL * 1.2";
let textN = "LUNATIC LEVEL * 1.5";
let textO = "TOTAL      "~NumToString(Total);

let a = GetCommonDataDefault("ALPHA",255);

if(GetPlayerX < 150&&GetPlayerY > 350){
a -= 16;
if(a < 70){a = 70;}
}
else{
a += 16;
if(a > 255){a = 255;}
}

SetFontColor(190,205,255,190,155,255);
DrawText(textA,64,388,12,a);
DrawText(textB,64,400,12,a);
DrawText(textD,64,424,12,a);
if(GetCommonData("DRAWBONUS") == 1){DrawText(textE,64,48,24,255);}
if(GetCommonData("DRAWBONUS") == 2){DrawText(textF,64,48,24,255);}
if(GetCommonData("DRAWMAX") == 1){DrawText(textC,98,72,24,255);}
if(GetCommonDataDefault("GAME_CLEAR",false) == true){
DrawText(textG,64,100,18,255);
DrawText(textH,64,136,18,255);
DrawText(textI,64,154,18,255);
DrawText(textJ,64,172,18,255);
DrawText(textK,64,190,18,255);
if(E > 0){DrawText(textL,64,226,18,255);}
if(H > 0){DrawText(textM,64,226,18,255);}
if(L > 0){DrawText(textN,64,226,18,255);}
DrawText(textO,64,252,18,255);
}

SetCommonData("ALPHA",a);
}

task MagicPowerOnStage{
SetCommonData("MAGICPOWER",0);
let PointA = 0;		//Ot[̓_ACe̐i[ϐ
let Point = GetPoint;	//_ACe̐i[ϐ
let MagicPower;		//͒li[ϐ
let MagicPoint;		//͓_i[ϐ
let ExtendCount = 0;	//{GNXehi[ϐ
let E = GetCommonData("EASY_START");
let N = GetCommonData("NORMAL_START");
let H = GetCommonData("HARD_START");
let L = GetCommonData("LUNATIC_START");
let level;
if(E > 0){level = 1;}
if(N > 0){level = 1;}
if(H > 0){level = 1.5;}
if(L > 0){level = 2;}


loop{
MagicPower = GetCommonData("MAGICPOWER");
MagicPoint = GetCommonData("MAGICPOINT");
Point = GetPoint;
//t[A_ACe̐A͒lA͓_擾

if(Point != PointA){					//_ACe擾Ƃ̏
if(Point >= PointA){					//_ACeĂ
MagicPower += MagicPoint * (Point - PointA) / (5000 + ExtendCount * 900) / level;//MagicPower𑝂₷
SetCommonData("MAGICPOWER",MagicPower);			//ʃf[^XV
}
PointA = Point;						//PointAVlɒ`Ȃ
}

if(MagicPower >= 100){					//POOz
if(GetPlayerBomb < 6){AddBomb(1);}			//{Uȉ̏ꍇ{{P
else{MagicPoint += 100;SetCommonData("MAGICPOINT",MagicPoint);}//{UȂAMasicPoint100Z
PlaySE(GetCurrentScriptDirectory~"\se\tm2_power000.wav");//炷
MagicPower -= 100;					//͒l|POO
ExtendCount++;						//GNXeh񐔁{P
SetCommonData("MAGICPOWER",MagicPower);			//ʃf[^XV
}

yield;	//厖
}
}

function ChackThePlayer{
if(GetPlayerType == REIMU_A||GetPlayerType == REIMU_B){return 1;}
if(GetPlayerType == MARISA_A||GetPlayerType == MARISA_B){return 2;}
if(GetPlayerType == USER_PLAYER&&ChoosePatchePlayer == 0){return 4;}
if(GetPlayerType == USER_PLAYER&&ChoosePatchePlayer == 1){return 1;}
if(GetPlayerType == USER_PLAYER&&ChoosePatchePlayer == 2){return 1;}
if(GetPlayerType == USER_PLAYER&&ChoosePatchePlayer == 3){return 2;}
if(GetPlayerType == USER_PLAYER&&ChoosePatchePlayer == 4){return 2;}
if(GetPlayerType == USER_PLAYER&&ChoosePatchePlayer == 5){return 3;}
if(GetPlayerType == USER_PLAYER&&ChoosePatchePlayer == 6){return 3;}
}


task FullItemOnStage{				//tp[ACeǗ^XN
SetCommonData("ItemXY",[]);			//ACeʒuWۑpʃf[^쐬
let ItemLimit=128;				//ACẽLI[o[i΍j
let ItemNum=0;					//STGV[ɑ݂ACe
let ItemCheck=0;				//ʃf[^̔z̒`FbNϐ
let XY=[];					//ʃf[^̏ɃNbVu߂̕ϐ
let ItemPerFrame=5;				//Pt[̍őACei΍j

loop{
ItemCheck=length(GetCommonDataDefault("ItemXY",[]));	//t[ʃf[^̒`FbN
if(ItemCheck>0){					//zɒgiACetOĂjꍇ̏
	loop(ItemPerFrame){
	XY=GetCommonDataDefault("ItemXY",[]);		//ʃf[^eϐɓn
	MakeFullItem(XY[0],XY[1]);			//ACeBԂXWAYW
	loop(2){
		XY=erase(XY, 0);}			//̂ł̗vfz񂩂폜
	if(length(XY)==0){				//폜̔z񂪋ɂȂꍇ
		SetCommonData("ItemXY",[]);		//ʃf[^ɂ
		break;					//ACe[vEo
	}
	else{SetCommonData("ItemXY",XY);}		//z񂪋łȂꍇʃf[^ɕύX̔zn
}
}
yield;
}


task MakeFullItem(x,y){				//ACeݒ
if(ItemNum>ItemLimit){return;}			//LI[o[ĂȂƂ
ItemNum++;					//ɃACe₷

let imgItem = GetCurrentScriptDirectory~"\img\Item.png";
LoadGraphic(imgItem);

let obj = Obj_Create(OBJ_EFFECT);
let E = GetCommonData("EASY_START");
let N = GetCommonData("NORMAL_START");
let H = GetCommonData("HARD_START");
let L = GetCommonData("LUNATIC_START");
ObjEffect_SetTexture(obj, imgItem);
ObjEffect_SetPrimitiveType(obj, PRIMITIVE_TRIANGLEFAN);
ObjEffect_SetLayer(obj,4);
ObjEffect_CreateVertex(obj, 4);

ObjEffect_SetVertexXY(obj,0,64,64);
ObjEffect_SetVertexXY(obj,1,64,0);
ObjEffect_SetVertexXY(obj,2,0,0);
ObjEffect_SetVertexXY(obj,3,0,64);
		
ObjEffect_SetVertexUV(obj,0,32,32);
ObjEffect_SetVertexUV(obj,1,32,0);
ObjEffect_SetVertexUV(obj,2,0,0);
ObjEffect_SetVertexUV(obj,3,0,32);

Obj_SetPosition( obj, x - 32, y - 32);
Obj_SetAlpha( obj, 255 );

let speed = -1.5;
SetCommonData("FULLITEM_ISCORRECT",false);

Obj_SetSpeed( obj, speed );
Obj_SetAngle( obj, 90);

while( !Obj_BeDeleted(obj) ){

let nX = Obj_GetX( obj );
let nY = Obj_GetY( obj );

if(speed <= 1.5){speed += 0.05;}
Obj_SetSpeed( obj, speed );

if(nY >= GetClipMaxY + 64){Obj_Delete(obj);}

if(OnBomb == true||GetPlayerY <= 128){SetCommonData("FULLITEM_ISCORRECT",true);}

if(GetCommonData("FULLITEM_ISCORRECT") == true){
Obj_SetSpeed( obj, 10);
Obj_SetAngle( obj, atan2( GetPlayerY() - Obj_GetY( obj ),GetPlayerX() - Obj_GetX( obj )) );
}

if( (((GetPlayerX() - nX)^2+(GetPlayerY()-nY )^2 )^0.5) < 67.88&&OnPlayerMissed() == false) {
if(E > 0||N > 0){SetCommonData("MAGICPOINT",999.999900);}
if(H > 0){SetCommonData("MAGICPOINT",1499.999900);}
if(L > 0){SetCommonData("MAGICPOINT",1999.999900);}
SetCommonData("FULLITEM_GET",1);
Obj_Delete(obj);
}

yield;
}


ItemNum--;//ŎɃACe炷
SetCommonData("FULLITEM_ISCORRECT",false);
}

}